前言

90年代中期,随着IP技术的快速发展,Internet数据海量增长。

但由于硬件技术存在限制,基于最长匹配算法的IP技术必须使用软件查找路由,转发性能低下,因此IP技术的转发性能成为当时限制网络发展的瓶颈。

为了适应网络的发展,ATM(Asynchronous Transfer Mode)技术应运而生。

ATM采用定长标签,并且只需要维护比路由表规模小得多的标签表,能够提供比IP路由方式高得多的转发性能。

然而,ATM协议相对复杂,且ATM网络部署成本高,这使得ATM技术很难普及。

传统的IP技术简单,且部署成本低,如何结合IP与ATM的优点成为当时热门话题。

多协议标签交换MPLS(Multi-Protocol Label Switching)就是在这种背景下产生的。

在MPLS的定义中,多协议(Multi-Protocol)指的是MPLS技术能够支持多种网络协议,例如IPv4、IPv6、CLNP(Connectionless Network Protocol)等。

标签交换(Label Switching)指的是MPLS设备能够为IP报文增加标签信息,并基于标签信息对报文进行转发,这提高了数据的转发效率。

MPLS并不是一种业务或者应用,它实际上是一种隧道技术,MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三层路由技术和第二层交换技术相结合。

与传统IP路由方式相比,它在数据转发时,只在网络边缘分析IP报文头(为了生成标签和最终剥离标签),而不用在MPLS网络中的每一跳都分析IP报文头(不需要读取目的ip地址以去查找路由),节约了处理时间。

简单来说,类似于交换中的vlan,不同的是转发设备之间仅根据标签进行转发,而不需要去检查目的地址。

这种技术不仅支持多种高层协议与业务,而且在一定程度上可以保证信息传输的安全性。

不过,MPLS虽然最初是为了提高路由器的转发速度而提出的,但随着专用集成电路ASIC(Application Specific Integrated Circuit)技术的发展,现在IP路由查找速度已经不是阻碍网络发展的瓶颈。

这使得MPLS在提高转发速度方面不再具备明显的优势,但是MPLS支持多层标签和转发平面面向连接的特性,使其在VPN(Virtual Private Network)、流量工程、QoS(Quality of Service)等方面得到广泛应用。

本文我们先介绍MPLS在IPv4网络中的应用、原理与配置,之后会另开一篇文章介绍其在VPN中的应用。

基本原理

基本概念

MPLS基于标签进行转发,进行MPLS标签交换和报文转发的网络设备称为标签交换路由器LSR(Label Switching Router)。

由LSR构成的网络区域称为MPLS域(MPLS Domain)。

位于MPLS域边缘、连接其他网络的LSR也被称为边缘路由器LER(Label Edge Router)。

具有相同转发处理方式的报文,称为转发等价类FEC(Forwarding Equivalent Class),FEC可以根据源地址、目的地址、源端口、目的端口、VPN等要素进行划分。

而标签(Label)是一个只具有本地意义的标识符,用于唯一标识一个分组所属的FEC,即一个标签只能代表一个FEC。

在MPLS网络中到达同一FEC所经过的路径,称为标签交换路径LSP(Label Switched Path)。

如图,IP报文进入MPLS网络时,MPLS入口的LER分析IP报文的内容,判断该报文是否属于已配置的转发等价类FEC;如果是,则为这些IP报文添加其FEC的标签;

所有MPLS网络中的LSR根据标签转发数据(在MPLS网络中,不要求标签固定不变);

当该添加了标签的IP报文离开MPLS网络时,标签由出口的LER弹出(剥离)。

该IP报文在MPLS网络中经过的路径就是标签交换路径LSP。LSP是一个单向路径,与数据流的方向一致。

LSP的入口LER称为入节点(Ingress);位于LSP中间的LSR称为中间节点(Transit);LSP的出口LER称为出节点(Egress)。

一条LSP可以有0个、1个或多个中间节点,但有且只有一个入节点和一个出节点。

其中,中间节点仅检查标签,根据标签进行转发;

而入节点需要检查报文的目的IP地址,根据路由等信息为报文添加标签;

出节点也需要检查检查报文的目的IP地址,去除标签后,根据路由进行转发。

工作过程与搭建原则

工作过程

我们以配置完的拓扑为例进行介绍,该拓扑的配置过程在后面展示,现在先学习理论内容:

全网配置为OSPF网络,网段信息如图所示。(主机IP地址为网段加设备id号)

现在在图中框选位置,构建一个MPLS的LSP路径,提供给从PC1到PC2的报文使用。

  1. 在R1处,我们需要配置到达192.168.4.0的报文打上标签[120],从接口g0/0/1出去;
  2. 那么在R2的接口g0/0/0处,就会收到该标签[120]的报文,R2就要配置来着接口g0/0/0的标签[120]报文,从接口g0/0/1出去,并打上标签[230];
  3. R3同上,最终更换标签为[340],从接口g0/0/1发出去;
  4. R4收到该标签[340]的报文后,因为192.168.4.0/24的网段就在R4直连接口上,所以我们就不用再配置标签转发了,反而需要在R4这里把标签删除,恢复为原始以太网报文。
  • 检查配置的话,R1的LSP信息如下:
1
2
3
4
5
6
7
[R1]display mpls static-lsp LSP1
TOTAL : 1 STATIC LSP(S)
UP : 1 STATIC LSP(S)
DOWN : 0 STATIC LSP(S)
Name FEC I/O Label I/O If Status
LSP1 192.168.4.0/24 NULL/120 -/GE0/0/1 Up

将目标网段192.168.4.0/24作为转发等价类FEC,则发出去时打上[120]的标签,从接口GE0/0/1发出去。

  • R2的LSP信息如下:
1
2
3
4
5
6
[R2]display mpls static-lsp LSP1
TOTAL : 1 STATIC LSP(S)
UP : 1 STATIC LSP(S)
DOWN : 0 STATIC LSP(S)
Name FEC I/O Label I/O If Status
LSP1 -/- 120/230 GE0/0/0/GE0/0/1 Up

R2作为中间节点,仅负责转发,因此它不检查转发等价类FEC;当它收到标签[120],入接口为GE0/0/0的报文,则从GE0/0/1发出并打上[230]的标签。

  • R4的LSP信息如下:
1
2
3
4
5
6
[R4]display mpls static-lsp LSP1
TOTAL : 1 STATIC LSP(S)
UP : 1 STATIC LSP(S)
DOWN : 0 STATIC LSP(S)
Name FEC I/O Label I/O If Status
LSP1 -/- 340/NULL GE0/0/0/- Up

R4作为出节点,在MPLS进程下仅负责弹出(剥离标签),从接口GE0/0/0收到标签[340]的报文,则修改标签为nill,即空,即删除标签。

这是,报文不由MPLS处理了,交由普通的以太网相关进程进行路由转发。(即查询IP路由表进行转发)

搭建原则

从以上拓扑与配置信息,我们不难总结出一个原则:

  • 本设备的出口标签=下一个设备的入口标签

以上配置信息的关键词时“static-lsp”,静态LSP。也就是是手工配置一台一台路由器,一个一个标签进行配置。

有静态,自然有动态了,但我们先介绍静态方式的配置,动态方式稍后我们介绍其余的MPLS理论知识再进行。

静态方式的配置

配置命令

配置LSR-id与启用MPLS功能:

  1. 执行命令system-view,进入系统视图。
  2. 执行命令mpls lsr-id lsr-id,配置本节点的LSR ID。
  3. 执行命令mpls,启用设备的MPLS协议,并进入MPLS视图。
  4. 执行命令quit,退回系统视图。
  5. 执行命令interface interface-type interface-number,进入需要转发MPLS报文的接口。
  6. 执行命令mpls,启用接口的MPLS。

配置入节点

  1. 执行命令system-view,进入系统视图。

  2. 执行命令static-lsp ingress lsp-name destination ip-address { mask-length | mask } nexthop next-hop-address [ outgoing-interface interface-type interface-number ] out-label out-label,配置为指定LSP的Ingress。

    destination ip-address { mask-length | mask }为判断FEC,请注意确保本地路由表中存在与指定目的IP地址精确匹配的路由项。

    nexthop next-hop-address [ outgoing-interface interface-type interface-number ] out-label out-label,指定该报文的下一跳或出接口,并指定该报文添加的标签。

下一跳ip地址必须与原有路由条目的下一跳ip地址一致。

配置中间节点

  1. 执行命令system-view,进入系统视图。

  2. 执行命令static-lsp transit lsp-name incoming-interface interface-type interface-number in-label in-label nexthop next-hop-address [ outgoing-interface interface-type interface-number ] out-label out-label out-label out-label,配置本节点为指定LSP的Transit。

    incoming-interface interface-type interface-number in-label in-label,为标识从指定接口收到的,指定标签的报文才进行后续的处理。

    nexthop next-hop-address [ outgoing-interface interface-type interface-number ] out-label out-label out-label out-label,指定该报文的下一跳或出接口,并修改其标签为指定标签。

配置出节点

  1. 执行命令system-view,进入系统视图。

  2. 执行命令static-lsp egress lsp-name incoming-interface interface-type interface-number in-label in-label [ lsrid ingress-lsr-id tunnel-id tunnel-id ],配置本节点为指定LSP的Egress。

    incoming-interface interface-type interface-number in-label in-label,为标识从指定接口收到的,指定标签的报文才进行剥离标签、弹出MPLS网络的处理。

案例

全网配置为OSPF网络,网段信息如图所示。(主机IP地址为网段加设备id号)

现在在图中框选位置,构建一个MPLS的LSP路径,提供给从PC1到PC2的报文使用。

配置OSPF网络

1
2
3
4
5
6
7
8
9
10
11
12
<Huawei>system-view
[Huawei]sysname R1
[R1]interface G0/0/0
[R1-GigabitEthernet0/0/0]ip address 192.168.1.254 255.255.255.0
[R1-GigabitEthernet0/0/0]q
[R1]interface G0/0/1
[R1-GigabitEthernet0/0/1]ip address 192.168.12.1 255.255.255.0
[R1-GigabitEthernet0/0/1]q
[R1]ospf 1 router-id 1.1.1.1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255
1
2
3
4
5
6
7
8
9
10
11
12
<Huawei>system-view
[Huawei]sysname R2
[R2]interface G0/0/0
[R2-GigabitEthernet0/0/0]ip address 192.168.12.2 255.255.255.0
[R2-GigabitEthernet0/0/0]q
[R2]interface G0/0/1
[R2-GigabitEthernet0/0/1]ip address 192.168.23.2 255.255.255.0
[R2-GigabitEthernet0/0/1]q
[R2]ospf 1 router-id 2.2.2.2
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]network 192.168.23.0 0.0.0.255
1
2
3
4
5
6
7
8
9
10
11
12
13
<Huawei>system-view
[Huawei]sysname R3
[R3]interface G0/0/0
[R3-GigabitEthernet0/0/0]
[R3-GigabitEthernet0/0/0]ip address 192.168.23.3 255.255.255.0
[R3-GigabitEthernet0/0/0]q
[R3]interface G0/0/1
[R3-GigabitEthernet0/0/1]ip address 192.168.34.3 255.255.255.0
[R3-GigabitEthernet0/0/1]q
[R3]ospf 1 router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 192.168.23.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]network 192.168.34.0 0.0.0.255
1
2
3
4
5
6
7
8
9
10
11
12
13
<Huawei>system-view
[Huawei]sysname R4
[R4]interface G0/0/0
[R4-GigabitEthernet0/0/0]
[R4-GigabitEthernet0/0/0]ip address 192.168.34.4 255.255.255.0
[R4-GigabitEthernet0/0/0]q
[R4]interface G0/0/1
[R4-GigabitEthernet0/0/1]ip address 192.168.4.254 255.255.255.0
[R4-GigabitEthernet0/0/1]q
[R4]ospf 1 router-id 4.4.4.4
[R4-ospf-1]area 0
[R4-ospf-1-area-0.0.0.0]network 192.168.34.0 0.0.0.255
[R4-ospf-1-area-0.0.0.0]network 192.168.4.0 0.0.0.255

配置完毕之后,使用PC1去ping一下PC4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PC>ping 192.168.4.4

Ping 192.168.4.4: 32 data bytes, Press Ctrl_C to break
Request timeout!
From 192.168.4.4: bytes=32 seq=2 ttl=124 time=15 ms
From 192.168.4.4: bytes=32 seq=3 ttl=124 time=47 ms
From 192.168.4.4: bytes=32 seq=4 ttl=124 time=31 ms
From 192.168.4.4: bytes=32 seq=5 ttl=124 time=16 ms

--- 192.168.4.4 ping statistics ---
5 packet(s) transmitted
4 packet(s) received
20.00% packet loss
round-trip min/avg/max = 0/27/47 ms

说明网络配置正确,接下来可以开始配置MPLS了。

配置静态LSP

在R1上配置为LSP1的入节点

首先,观察R1的路由:

1
192.168.4.0/24  OSPF    10   4           D   192.168.12.2    GigabitEthernet0/0/1

已确实存在前往PC4所处网段的路由。

那么根据该路由编写入节点命令:

1
2
3
4
5
6
7
[R1]mpls lsr-id 1.1.1.1
[R1]mpls
[R1-mpls]q
[R1]interface g0/0/1
[R1-GigabitEthernet0/0/0]mpls
[R1-GigabitEthernet0/0/0]q
[R1]static-lsp ingress LSP1 destination 192.168.4.0 24 nexthop 192.168.12.2 outgoing-interface g0/0/1 out-label 120

在R2、R3上配置为LSP1的中间节点

1
2
3
4
5
6
7
8
9
<R2>system-view
[R2]mpls lsr-id 2.2.2.2
[R2]mpls
[R2-mpls]interface G0/0/0
[R2-GigabitEthernet0/0/0]mpls
[R2-GigabitEthernet0/0/0]interface G0/0/1
[R2-GigabitEthernet0/0/1]mpls
[R2-GigabitEthernet0/0/1]q
[R2]static-lsp transit LSP1 incoming-interface g0/0/0 in-label 120 nexthop 192.168.23.3 outgoing-interface g0/0/1 out-label 230
1
2
3
4
5
6
7
8
9
<R3>system-view
[R3]mpls lsr-id 3.3.3.3
[R3]mpls
[R3-mpls]interface G0/0/0
[R3-GigabitEthernet0/0/0]mpls
[R3-GigabitEthernet0/0/0]interface G0/0/1
[R3-GigabitEthernet0/0/1]mpls
[R3-GigabitEthernet0/0/1]q
[R3]static-lsp transit LSP1 incoming-interface g0/0/0 in-label 230 nexthop 192.168.34.4 outgoing-interface g0/0/1 out-label 340

注意:必须指定下一跳IP地址,否则虽然检查配置是生效了,但还是无法进行通信。

在R4上配置为LSP1的出节点

1
2
3
4
5
6
7
8
<R4>system-view 
[R4]mpls lsr-id 4.4.4.4
[R4]mpls
[R4-mpls]q
[R4]interface g0/0/0
[R4-GigabitEthernet0/0/0]mpls
[R4-GigabitEthernet0/0/0]q
[R4]static-lsp egress LSP1 incoming-interface g0/0/0 in-label 340

小结

完成以上的配置后,从R1到R4的192.168.4.0/24网段的通信都会经过LSP1的路径,通过标签进行转发。

但这是单向的,使用PC1去ping PC2,同时进行抓包的话,就能看到去的报文被打上了MPLS标签,回来的报文则没有。

另外需要注意的就是上面提到的,中间节点需要配置下一跳IP地址。

当然,还有一个大前提,那就是路由表中必须已经存在到达192.168.4.0/24网段的路由。

详细探讨MPLS数据转发过程

标签栈与标签动作

MPLS报文格式如下:

可以看到MPLS报文是在传统以太网IP报文的二层数据帧头部IP报文头部中间插入了[标签栈]。

标签栈是存储[标签段]的,理论上不设上限,可以存无数个[标签段]。

[标签段]内的字段分别如下:

  • Label:20bit,标签值。

  • Exp:3bit,用于扩展。现在通常用做CoS(Class of Service),当设备阻塞时,优先发送优先级高的报文。

  • BoS:1bit,栈底标识。S值为1时表示为最底层标签,0表示后面还有[标签段]

  • TTL:8bit,和IP报文中的TTL(Time To Live)意义相同。

    (MPLS的原旨就是让设备无需解封装读取太多内容,因此将IP报文中用于防环的TTL字段也配置到[标签段]中来。)

标签栈中的[标签段]遵循先入后出,后入先出的原则,说来了,就跟手枪弹夹类似。

对[标签段]的操作可以分为以下三类:(实际你可以理解为两类,置换本质就是先弹出一个后,再压入另一个。)

  • Push(压入):当IP报文进入MPLS域时,MPLS边界设备在报文二层首部和IP首部之间插入一个新标签;或者MPLS中间设备根据需要,在标签栈顶增加一个新的标签(即标签嵌套封装)。

  • Swap(置换):当报文在MPLS域内转发时,根据标签转发表,用下一跳分配的标签,替换MPLS报文的栈顶标签。

  • Pop(弹出):当报文离开MPLS域时,将MPLS报文的标签剥掉。

    在最后一跳节点,标签已经没有使用价值。另外,这种情况下,可以在倒数第二跳节点处将标签弹出,以减少最后一跳的负担。

标签的取值范围:

  • 0~15:特殊标签。(部分为保留,没有实际意义)
  • 16~1023:静态LSP和静态CR-LSP(Constraint-based Routed Label Switched Path)共享的标签范围。
  • 1024及以上:LDP、RSVP-TE(Resource Reservation Protocol-Traffic Engineering)、MP-BGP(MultiProtocol Border Gateway Protocol)等动态标签协议的标签范围。

隧道ID、FIB表、NHLFE表、ILM表

  • Tunnel ID

    一般来说,我们会成一条LSP为隧道。而为了给使用隧道的上层应用(如VPN、路由管理)提供统一的接口,系统自动为隧道分配了一个ID,也称为Tunnel ID。

    该Tunnel ID的长度为32比特,只是本地有效。

  • FIB

    转发信息表FIB(Forwarding Information Base):从本地路由表中提取必要的路由信息再经过各种分析生成,负责普通IP报文的转发。

    我们在查询路由表时,会看到有一个flag标记为“D”的,其意思就是该路由条目被“Download”到了FIB中了。

    严谨来说,报文的转发是依据FIB表的,只是我们通常忽视它,直接称为依据路由表进行转发。

    FIB表中含有Tunnel ID字段,当该字段为0时,表示该目的网段不需要经过隧道,因此直接进行普通的IP报文转发;

    而如果该字段有值,则需要去根据该隧道ID去查询接下来介绍的两张表,让报文按配置进行对应的标签转发流程。

  • NHLFE

    下一跳标签转发表项NHLFE(Next Hop Label Forwarding Entry)用于指导MPLS报文的转发。

    NHLFE包括:Tunnel ID、出接口、下一跳、出标签、标签操作类型等信息。

    FEC到一组NHLFE的映射称为FTN(FEC-to-NHLFE)。通过查看FIB表中Tunnel ID值不为0x0的表项,能够获得FTN的详细信息。FTN只在Ingress存在。

  • ILM

    入标签到一组NHLFE的映射称为入标签映射ILM(Incoming Label Map)。

    ILM包括:Tunnel ID、入标签、入接口、标签操作类型等信息。

    ILM在Transit节点的作用是将标签和NHLFE绑定。通过标签索引ILM表,就相当于使用目的IP地址查询FIB,能够得到所有的标签转发信息。

转发过程

了解了以上的概念之后,我们重新详细介绍以下MPLS中报文的转发过程

直接使用与前面介绍静态LSP类似的拓扑,不过具体的标签配置的不一样,直接介绍每个路由器对报文的处理过程。


R1:

  1. 当10.1.1.0/24网段中的PC发送数据给10.2.2.2时,IP报文首先被发往R1。
  2. R1收到报文后,从报文的二层头部的“类型”字段判断出,载荷数据是P报文;
  3. 因此接下来R1在自己的FB表中查询与报文的目的P地址10.2.2.2相匹配的表项,根据最长匹配原则,找到路由表项10.2.2.0/24;
  4. 并且发现该表项的Tunnel ID为0x13,R1意识到需要将报文送入隧道;
  5. 但是目前还缺乏足够的转发信息,因此它继续在NHLFE中查询Tunnel ID 0x13,发现的确有一个匹配该Tunnel ID的表项;
  6. 该表项的出站接口为GE0/0/1、下一跳IP地址为10.1.12.2、出站标签为1025,而且标签操作为Push;
  7. 于是R1根据NHLFE表项的指示,在报文的P头部之前压入一个标签头部,标签值为1025;
  8. 接着R1重新将该报文封装成帧,将数据帧从GE0/0/1接口转发给R2。

R2:

  1. R2收到了R1转发过来的标签报文后,它从报文的二层头部的“类型”字段判断出,载荷数据是MPLS标签报文;
  2. 因此R2将不会在FIB表中查询该报文的目的P地址,而是根据报文所携带的标签获取转发信息;
  3. R2将二层帧头剥除,读取顶层标签值1025,然后在ILM中查询该标签值,结果找到了匹配的表项;
  4. 该表项的Tunnel ID为0x19,且标签操作为Swap;
  5. R2继续在NHLFE中查询Tunnel ID0xl9并找到了一个匹配的表项,该表项的出站接口为GE0/0/1,下一跳P地址为10.1.23.3,出站标签为1029;
  6. R2根据表项的指示,将报文原有的标签1025置换为1029,接着重新将该报文封装成帧,并将数据帧从GE0/0/1接口转发给R3。

R3:

  1. R3收到了R2转发过来的标签报文后,它将帧头剥除,读取标签值1029,然后在ILM中查询该标签值,结果找到了匹配的表项;
  2. 该表项的Tunnel ID为Oxf,R3继续在NHLFE中查询这个Tunnel ID并找到了一个匹配的表项;
  3. 该表项的出站接口为GE0/0/1、下一跳P地址为10.1.34.4、出站标签为1031,且标签操作为Swap;
  4. R3根据表项的指示,将报文原有的标签1029置换为1031,然后重新将该报文封装成帧,将数据帧从GE0/0/1接口转发给R4。

R4:

  1. R4收到标签报文后,在ILM中查询报文所携带的标签1031,从匹配的表项中,R4发现对应的标签操作为弹出(Pop),于是它将报文的标签头部弹出;
  2. 由于当前报文仅有一层标签头部(该标签头部的BoS字段的值为1),因此弹出之后,得到的报文即为原始的P报文;
  3. 接下来,R4在FIB表中查询该报文的目的IP地址10.2.2.2,然后按照匹配的表项进行转发(执行路由操作)。
  4. 最终报文到达了目的地。

动态标签协议

前面我们亲手搭建过静态的LSP了,说实话,有一点繁琐。

因为我们搭建的只是一条LSP,LSP是单向的,所以说如果是要让两个网段之间都走隧道,那么需要配置两条LSP。

此外,如果网络中设备很多,再加上要配置隧道的网段数量也不少,那么手动配置很成问题。

更别提如果中间有设备故障,或者链路更换了物理接口等拓扑结构发生变化的情况导致LSP失效的可能性。

因此,在中大规模网络中,通常都是配置动态标签分发协议。

基本原理

以前面介绍转发过程的拓扑为例,如果要设计动态标签协议的话;

最好的入手点就是与[目的网段]直连的路由器,在此路由器上创建[目标网段]到标签的映射;

然后将该映射关系发生出去,供其他路由器进行学习。

其他路由学习到后,就创建对应的出接口、出标签的映射关系保存在本地;

同时在创建该[目标网段]到另一个标签的映射,然后将该映射关系发生出去,供其他路由器进行学习。

。。。

如此下去,就能将路由、标签、出接口等信息在网络中同步传播了。(其实这颇有一种RIP协议的意味)

LDP协议

标签分发协议LDP(Label Distribution Protocol)是多协议标签交换MPLS的一种控制协议,负责转发等价类FEC的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。

通过LDP协议,标签交换路由器LSR可以把网络层的路由信息直接映射到数据链路层的交换路径上,动态建立起网络层的LSP。

目前,LDP广泛地应用在VPN服务上,具有组网、配置简单、支持基于路由动态建立LSP、支持大容量LSP等优点。

LDP的基本工作原理就跟上面提到的一样,由直连[目的网段]的路由器进行通告。

实际配置时,只需要确保各路由器之间都全网互通,都有相应的路由条目即可。

LDP协议作为自动化程度很高的协议,倒也没什么特别好讲的,如果好奇具体的工作原理(邻居建立、报文交互、标签生成过程等等),请自行查阅资料。

LDP消息类型与工作过程

LDP的工作过程类似路由协议,默认也是通过组播去发现“邻居”,建立关系,交换信息。

不过就想BGP一样,我们称之为“对等体”;而且对等体也分相邻的,与不相邻的。

  • 本地对等体:以组播形式发送Hello消息(即链路Hello消息)发现的。(目的地址是组播地址224.0.0.2。)
  • 远端对等体:以单播形式发送Hello消息(即目标Hello消息)发现的。

组播只能在一个广播域内传播,而路由器是隔离广播域的,因此组播方式去发现的对等体就都是相邻的、直连的;也是因此才会被叫做“本地”。

LDP协议主要使用四类消息:

  • 发现(Discovery)消息:用于通告和维护网络中LSR的存在,如Hello消息。
  • 会话(Session)消息:用于建立、维护和终止LDP对等体之间的会话,如Initialization消息、Keepalive消息。
  • 通告(Advertisement)消息:用于创建、改变和删除FEC的标签映射。
  • 通知(Notification)消息:用于提供建议性的消息和差错通知。

为保证LDP消息的可靠发送,除了Discovery消息使用UDP(User Datagram Protocol)传输外;

LDP的Session消息、Advertisement消息和Notification消息都使用TCP(Transmission Control Protocol)传输。

LDP会话建立工作过程

假如现在存在两条路由器:LSR_1(192.168.12.1 /24),LSR_2(192.168.12.2 /24)

  1. 两个LSR之间互相发送Hello消息。

    Hello消息中携带传输地址(即设备的IP地址),双方使用传输地址建立LDP会话。

  2. 传输地址较大的一方作为主动方,发起建立TCP连接。

    LSR_2作为主动方发起建立TCP连接,LSR_1作为被动方等待对方发起连接。

  3. TCP连接建立成功后,由主动方LSR_2发送Initialization(初始化)消息,协商建立LDP会话的相关参数。

    LDP会话的相关参数包括LDP协议版本、标签分发方式、Keepalive保持定时器的值、最大PDU长度和标签空间等。

  4. 被动方LSR_1收到LSR_2的Initialization(初始化)消息后,接受相关参数,则发送自己的Initialization(初始化)消息,以及Keepalive消息给主动方LSR_2。

    如果被动方LSR_1不能接受相关参数,则发送Notification(通知)消息终止LDP会话的建立。

  5. 主动方LSR_2收到LSR_1的Initialization(初始化)消息后,接受相关参数,则发送Keepalive消息给被动方LSR_1。

    如果主动方LSR_2不能接受相关参数,则发送Notification消息给被动方LSR_1终止LDP会话的建立。

当双方都收到对端的Keepalive消息后,LDP会话建立成功。

LDP基础配置

基础配置(本地LDP会话)

  1. 执行命令system-view,进入系统视图。
  2. 执行命令mpls lsr-id lsr-id,配置本节点的LSR ID。
  3. 执行命令mpls,启用设备的MPLS协议,并进入MPLS视图。
  4. 执行命令mpls ldp,使能全局的LDP功能,并进入MPLS-LDP视图。
  5. 执行命令quit,退回系统视图。
  6. 执行命令interface interface-type interface-number,进入需要转发MPLS报文的接口。
  7. 执行命令mpls,启用接口的MPLS。
  8. 执行命令mpls ldp,使能接口的MPLS LDP能力。

配置完以上命令后,设备就会使用组播报文去发现“邻居”,再构建TCP会话,交互标签信息。

组播报文,与广播报文一样,无法跨广播域传递;而路由器是隔绝广播域的,因此无法让不相邻的两台路由器互相发现彼此。

如果有要让路由器跨设备构建“邻居”关系,则可以配置远端LDP会话。

配置远端LDP会话

需要在远端LDP会话两端的LSR上都进行以下配置。

  1. 执行命令system-view,进入系统视图。
  2. 执行命令mpls ldp remote-peer remote-peer-name,创建MPLS LDP远端对等体,并进入MPLS LDP远端对等体视图。
  3. 执行命令remote-ip ip-address,指定MPLS LDP远端对等体(邻居)的IP地址。

LDP原理细节

标签分发方式

目前的广泛采用的默认设置为:下游自主方式(DU)+ 有序标签分配控制方式(Ordered)+ 自由标签保持方式(Liberal)。

另外可采用的组合方式为:下游按需方式(DoD)+ 有序标签分配控制方式(Ordered)+ 保守标签保持方式(Conservative)。

我们分别介绍一下这几种方式。

自主方式与按需方式

  • 下游自主方式DU(Downstream Unsolicited):对于一个特定的FEC,LSR无需从获得标签请求消息即可直接进行标签分配与分发。

    如图所示,对于目的地址为192.168.1.1/32的FEC,下游(Egress)通过标签映射消息主动向上游(Transit)通告自己的主机路由192.168.1.1/32的标签。

    标签发布方式为DU时,系统默认支持LDP为所有对等体分标签,即每个节点都可以向所有的对等体发送标签映射消息,不再区分上下游关系。

    因为在只给上游对等体分标签情况下,发送标签映射消息的时候,要根据路由信息对会话的上下游关系进行确认。

    如果发生路由变化,上下游关系倒换,新的下游需要重新给上游节点发送标签映射消息,收敛比较慢。

  • 下游按需方式DoD(Downstream on Demand):对于一个特定的FEC,LSR必须获得标签请求消息之后才能进行标签分配与分发。

    如图所示,对于目的地址为192.168.1.1/32的FEC,上游(Ingress)向下游发送标签请求消息,下游(Egress)收到标签请求消息后,才会向上游发送标签映射消息。

配置
  1. 执行命令system-view,进入系统视图。

  2. 执行命令interface interface-type interface-number,进入接口视图。

  3. 执行命令mpls ldp advertisement { dod | du },配置标签发布方式。

    默认情况下,标签发布模式为下游自主标签分发DU。

有序标签分配控制方式

  • 对于LSR上某个FEC的标签映射,只有当该LSR就是此FEC的出节点、或者该LSR已经具有此FEC下一跳的标签映射消息,该LSR才可以向上游发送此FEC的标签映射。

也就是说,路由器照着路由表生成了标签映射关系后,不会立即对外发送,除非该路由是直连路由,“我”作为出节点;

或者该路由的下一跳设备发送了标签映射信息给“我”了,这样“我”就能作为中间节点,只进行标签的置换与报文的转发,保证报文能通过LSP隧道到达出节点。

配置
  1. 执行命令system-view,进入系统视图。

  2. 执行命令mpls ldp,进入MPLS-LDP视图。

  3. 执行命令label distribution control-mode { independent | ordered },配置LDP标签分配控制方式。

    默认情况下,LDP标签分配控制方式为有序标签分配控制(Ordered)。

标签保持方式

标签保持方式是指LSR对收到的、但目前暂时不需要的标签映射的处理方式。

  • 自由标签保持方式(Liberal):对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。

    当需要跨设备建立LDP关系时,就必须保证设定为自由标签保持方式。

  • 保守标签保持方式(Conservative):对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。

PHP特性

在LSP的最后一跳节点,已不需要再进行标签交换。

此时,可以配置倒数第二跳弹出特性PHP(Penultimate Hop Popping),在倒数第二跳节点处将标签弹出;

最后一跳节点直接进行IP转发或者下一层标签转发,减少最后一跳标签交换的负担。

所谓的PHP特性指的是出节点为其直连路由生成映射标签时,指定为特殊标签“3”。

Implicit NULL Label(隐式空标签,标签值=3): 倒数第二跳LSR进行标签交换时,如果发现交换后的标签值为3,则将标签弹出,并将报文发给最后一跳。最后一跳收到该报文直接进行IP转发或下一层标签转发。

配置

  1. 执行命令system-view,进入系统视图。

  2. 执行命令mpls,进入MPLS视图。

  3. 执行命令label advertise { explicit-null | implicit-null | non-null },配置向倒数第二跳分配的标签。

    根据参数的不同,可以配置Egress向倒数第二跳分配不同的标签。

    • 缺省情况下,使用的是implicit-null,表示支持PHP。Egress向倒数第二跳节点分配隐式空标签,值为3。
    • 如果配置的是explicit-null,表示不支持PHP,但Egress节点向倒数第二跳分配显式空标签,值为0。当需要支持MPLS QoS属性时,可以选用explicit-null
    • 如果配置的是non-null,表示不支持PHP。Egress向倒数第二跳正常分配标签,即分配的标签值不小于16。

    执行命令label advertise修改本节点的标签分配方式只会对新建的LSP生效,如果修改label advertise之前已经存在LSP,则不会生效,需要执行reset mpls ldplsp-trigger策略命令后才会生效。

触发策略

启用MPLS LDP功能后,路由器会根据自身的路由表去创建标签映射关系,最终建立多条LSP。

但很多时候路由器的路由表是很庞大的,且我们并不需要为每一条路由都建立LSP隧道,因此可以配置触发策略,减少MPLS网络中的LSP数量。

  • 在Ingress和Egress上配置lsp-trigger策略,使符合条件的路由触发LSP的建立,从而控制LSP的数量,节约网络资源。
  • 在Transit上配置propagate mapping策略,只允许通过过滤条件的路由触发LSP的建立,而对于没有通过过滤条件的路由,本地将不往上游发送标签映射消息,这样可以有效减少LSP的数量,节约网络资源。

通常情况下,建议配置lsp-trigger策略;若由于某种特殊原因在Ingress和Egress上不能配置策略,则在Transit上配置propagate mapping策略。

在Ingress和Egress上配置lsp-trigger

  1. 执行命令system-view,进入系统视图。

  2. 执行命令mpls,进入MPLS视图。

  3. 执行下面命令,配置LSP触发建立策略。

    • 执行命令lsp-trigger { all | host | ip-prefix ip-prefix-name | none },配置触发静态路由和IGP路由建立LSP的策略。

      默认情况下,触发策略为host,即只为32位的主机路由触发生成标签,发布标签映射信息。

      使用此方式的话,创建回环接口,设定IP地址时需要配置为32位掩码;

      而对于普通的物理接口,配置非32位的IP地址时,系统会自动生成一条32位的主机路由,这是可以配触发的。

    • 执行命令lsp-trigger bgp-label-route [ ip-prefix ip-prefix-name ],配置触发带标签的公网BGP路由建立LSP的策略。

      默认情况下,LDP不为带标签的公网BGP路由分标签。

  4. 执行命令proxy-egress disable,配置禁止建立代理Egress LSP。

    默认情况下,系统允许建立代理Egress LSP。

    当LSP的触发策略为所有静态路由和IGP路由项触发建立LSP或根据IP地址前缀列表触发建立LSP时,会触发建立代理Egress LSP。

    但这些代理Egress LSP很可能是无用的,会耗费系统资源。此时可以执行本命令禁止建立代理Egress LSP。

在Transit上配置propagate mapping

  1. 执行命令system-view,进入系统视图。
  2. 执行命令mpls ldp,进入MPLS LDP视图。
  3. 执行命令propagate mapping for ip-prefix ip-prefix-name,配置LSP建立策略——对收到标签映射信息进行过滤(使用 ip-prefix 过滤器)。

总结

需要特别注意的就是华为设备默认的lsp-trigger触发方式为host,如果项目需求是要为网段构建LSP,则需要将该命令修改为all或者指定的ip-prefix。

而默认为host的原因是处于现如今MPLS常被用于VPN,而VPN中的需求常常只是特定的几台设备需要走VPN,这就可以只用主机路由。

此外,MPLS LDP中还可以配置密码认证、与BFD等协议联动、修改定时器、优化减少报文等等可选配置。但这超出本文的范围了,这边不作介绍。